#[cfg(test)]
mod tests {
    use crate::dpml::*;

    #[test]
    fn test_dpml_parser_creation() {
        let parser = DpmlParser::new();
        assert!(parser.is_ok());
    }

    #[test]
    fn test_simple_element_parsing() {
        let mut parser = DpmlParser::new().unwrap();
        let source = r#"<prompt>Hello World</prompt>"#;
        
        let doc = parser.parse(source).unwrap();
        let elements = doc.elements();
        
        assert_eq!(elements.len(), 1);
        assert_eq!(elements[0].tag_name(), "prompt");
        assert!(!elements[0].is_self_closing());
    }

    #[test]
    fn test_self_closing_element() {
        let mut parser = DpmlParser::new().unwrap();
        let source = r#"<resource type="reference" src="docs/api-spec.md" />"#;
        
        let doc = parser.parse(source).unwrap();
        let elements = doc.elements();
        
        assert_eq!(elements.len(), 1);
        assert_eq!(elements[0].tag_name(), "resource");
        assert!(elements[0].is_self_closing());
        assert_eq!(elements[0].get_attribute("type"), Some(&"reference".to_string()));
        assert_eq!(elements[0].get_attribute("src"), Some(&"docs/api-spec.md".to_string()));
    }

    #[test]
    fn test_nested_elements() {
        let mut parser = DpmlParser::new().unwrap();
        let source = r#"
<prompt>
  <thinking type="analysis">
    # 问题分析
    这是一个数据处理问题
  </thinking>
  <executing>
    执行步骤
  </executing>
</prompt>"#;
        
        let doc = parser.parse(source).unwrap();
        let elements = doc.elements();
        
        // 应该有3个元素：prompt, thinking, executing
        assert_eq!(elements.len(), 3);
        
        let thinking_elements = doc.find_elements_by_tag("thinking");
        assert_eq!(thinking_elements.len(), 1);
        assert_eq!(thinking_elements[0].get_attribute("type"), Some(&"analysis".to_string()));
    }

    #[test]
    fn test_resource_references() {
        let mut parser = DpmlParser::new().unwrap();
        let source = r#"
<prompt>
  参考资源：@file://document.md
  热加载：@!https://example.com/data
  懒加载：@?file://large-dataset.csv
</prompt>"#;
        
        let doc = parser.parse(source).unwrap();
        let references = doc.resource_references();
        
        assert_eq!(references.len(), 3);
        
        // 检查第一个引用
        assert_eq!(references[0].prefix(), "@");
        assert_eq!(references[0].protocol(), "file");
        assert_eq!(references[0].path(), "document.md");
        
        // 检查第二个引用
        assert_eq!(references[1].prefix(), "@!");
        assert_eq!(references[1].protocol(), "https");
        assert_eq!(references[1].path(), "example.com/data");
        
        // 检查第三个引用
        assert_eq!(references[2].prefix(), "@?");
        assert_eq!(references[2].protocol(), "file");
        assert_eq!(references[2].path(), "large-dataset.csv");
    }

    #[test]
    fn test_term_references() {
        let mut parser = DpmlParser::new().unwrap();
        let source = r#"
<prompt>
  相关术语：#数据处理 和 #性能优化
  另一个术语：#算法设计
</prompt>"#;
        
        let doc = parser.parse(source).unwrap();
        let references = doc.term_references();
        
        assert_eq!(references.len(), 3);
        assert_eq!(references[0].term(), "数据处理");
        assert_eq!(references[1].term(), "性能优化");
        assert_eq!(references[2].term(), "算法设计");
    }

    #[test]
    fn test_namespace_tags() {
        let mut parser = DpmlParser::new().unwrap();
        let source = r#"<store:execution>存储操作</store:execution>"#;
        
        let doc = parser.parse(source).unwrap();
        let elements = doc.elements();
        
        assert_eq!(elements.len(), 1);
        assert_eq!(elements[0].tag_name(), "store:execution");
    }

    #[test]
    fn test_complex_dpml_document() {
        let mut parser = DpmlParser::new().unwrap();
        let source = r#"
<prompt>
  <thinking type="analysis">
    # 问题分析
    这是一个**数据处理**问题，需要考虑：
    1. 数据格式转换
    2. 性能优化
    
    参考资源：@file://document.md
    相关术语：#数据处理
  </thinking>
  
  <executing>
    # 执行步骤
    1. 首先读取输入文件
    2. 应用转换算法
    3. 输出结果到目标位置
    
    确保全程**记录日志**以便调试。
  </executing>
  
  <resource type="reference" src="docs/api-spec.md" />
</prompt>"#;
        
        let doc = parser.parse(source).unwrap();
        
        // 检查元素
        let elements = doc.elements();
        assert!(elements.len() >= 3); // prompt, thinking, executing, resource
        
        // 检查资源引用
        let resource_refs = doc.resource_references();
        assert_eq!(resource_refs.len(), 1);
        assert_eq!(resource_refs[0].protocol(), "file");
        
        // 检查术语引用
        let term_refs = doc.term_references();
        assert_eq!(term_refs.len(), 1);
        assert_eq!(term_refs[0].term(), "数据处理");
        
        // 检查特定标签
        let thinking_elements = doc.find_elements_by_tag("thinking");
        assert_eq!(thinking_elements.len(), 1);
        assert_eq!(thinking_elements[0].get_attribute("type"), Some(&"analysis".to_string()));
    }

    #[test]
    fn test_comments() {
        let mut parser = DpmlParser::new().unwrap();
        let source = r#"
<!-- 这是一个注释 -->
<prompt>
  <!-- 另一个注释 -->
  <thinking>分析内容</thinking>
</prompt>"#;
        
        let doc = parser.parse(source).unwrap();
        let elements = doc.elements();
        
        // 注释不应该被解析为元素
        assert_eq!(elements.len(), 2); // prompt 和 thinking
    }
}
